package com.client;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import com.metier.logique.ThreadInterface;



/**
 * @author Ambroise
 * @name Main
 * @description Classe principale du projet. Gère les threads utilisés.
 * 				http://www.siteduzero.com/tutoriel-3-509342-le-framework-executor.html - Pour comprendre le fonctionnement du pool de threads.
 * @méthodes
 * 			+ main - Méthode statique appellée dès le chargement du programme. Crée les threads et lance le programme.
 * 			+ executeRunnables - Méthode statique qui exécute tous les éléments 'Runnables' qu'elle reçoit.
 */
public class Main {

	/**
	 * @name main
	 * @description Méthode statique appellée dès le chargement du programme. Crée un pool de threads et lance le programme.
	 */
	public static void main(String[] args) {
		
		// On crée une liste (un pool) destinée à contenir nos threads.
		List<Runnable> threads = new ArrayList<Runnable>();
		
		// On ajoute notre fenêtre principale comme étant un thread dans ce pool.
		threads.add(new ThreadInterface());

		// On crée un pool pouvant utiliser autant de threads qu'il y a de processeurs.
		ExecutorService execute = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
		
		executeRunnables(execute, threads);
	}
	

	/**
	 * @name executeRunnables
	 * @description Méthode statique qui exécute tous les éléments 'Runnables' qu'elle reçoit.
	 */
	public static void executeRunnables(final ExecutorService service, List<Runnable> runnables){
        //On exécute chaque "Runnable" de la liste "runnables"
		for(Runnable threads : runnables){
		
			service.execute(threads);
		}
		service.shutdown();
	}

}
